Amazon SageMaker Data Wranglerに再入門する(2022年12月版)その1
はじめに
こんちには。
データアナリティクス事業本部 機械学習チームの中村です。
本記事は「クラスメソッド 機械学習チーム アドベントカレンダー 2022」の19日目です。
本記事ではAmazon SageMaker Data Wranglerに入門していきます。
Data Wranglerは機能が多いため2回に分けようと思います。
今回は「データソース」→「Transform」→「Destination」という流れで実施します。
「Analysis」と「Train model」など次回以降とさせてください。
Amazon SageMaker Data Wranglerとは
Amazon SageMaker Data WranglerはSageMaker Studio上の機能で、機械学習向けの前処理を行うサービスです。
ほとんどコーディングなしでデータの前処理と特徴量エンジニアリングを簡素化・効率化することができます。
また様々なソース(S3、Athena、Redshiftなど)および40以上のサードパーティのソースにアクセスすることが可能です。
Pricing(料金)
使用する前にPricingを確認していきましょう。
Data Wranglerを使用する際は、動作させるためのインスタンス(カーネル)が立ち上がるため、立ち上がっている間は料金が発生します。 2022年12現在、選択可能な最も安いインスタンスで1時間当たり1ドルちょっと必要となっています(東京リージョンで$1.19)。
機能概要
公式ドキュメントとしては以下に記載されています。
主要な機能は以下となっています。
- Import
- S3、Athena、Redshift、Snowflake、Databricksに接続し、データをインポートすることが可能。
- Data Flow
- Data Flowを使用して、異なるデータソースのデータセットを結合したり、データセットに適用したい数字や型変換などの、MLパイプラインに統合できるdata preparation workflowを定義することが可能。
- Transform
- 文字列、ベクトル、数値データの整形ツールのような標準的な変換を使用して、データセットをクリーンにして変換する。
- テキスト、日付/時刻の埋め込み、カテゴリエンコーディングなどの変換を使用して、データを特徴付けることが可能。
- Generate Data Insights
- データインサイトと品質レポートにより、データ品質を自動的に検証し、データの異常を検出
- Analyze
- フローのどの時点でも、データセットの特徴を分析することが可能
- Export
- data preparation workflowを別の場所にエクスポート
- エクスポート可能なのは、S3やSageMaker Model Building Pipelines、SageMaker FeatureStoreです。Pythonスクリプトとしてもエクスポートできます。
以降ではそれぞれの機能を実際に使ってみたいと思います。
使ってみた
SageMaker Studio DomainやDomainのユーザは作成済みの前提で進めます。
なお、使用するDomainのユーザの実行ロールには以下のポリシーが割り当てされたものを使用します。
- arn:aws:iam::aws:policy/AmazonSageMakerFullAccess
- arn:aws:iam::aws:policy/AmazonS3FullAccess
Data Wranglerの起動
Studioを起動して、左側の「Homeアイコン」をクリックするとメニュー一覧が出るため、「Data」のドロップダウンから「Data Wrangler」を選択します。
すると、untitled.flowというタブが立ち上がり、以下のような準備中の画面となります。
立ち上がると、以下のようなタブが表示されます。
ここで「Use sample data」を押せば、あらかじめ準備されたSample Dataを使用することも可能ですが、今回は練習のために自身でS3に配置したものを読み込みたいと思います。
この時点で既に、ml.m5.4xlarge
インスタンスが立ち上がっているので、料金が発生し始めます。
稼働状況の確認方法は、後述の「補足1:インスタンスの稼働状況」に記載しましたので、気にしつつ進めてください。
S3へのデータ準備
今回はTitanicのデータセットを使用します。以下からダウンロード可能です。
これらのファイルをS3バケットにアップロードします。今回は以下にアップロードしました。
s3://nakamura-test-sagemaker-2022-12-16/titanic/train.csv
データソースの作成準備
次にData Wranglerの画面でデータソースを作成します。以下から「Amazon S3」を選択します。
ここからtrain.csvを見つけて選択すると、プレビューなどが表示されます。
読み込みの際の設定項目は、以下のようになっています。
- File type
- csv, parquet, json, jsonl, orcに対応
- First row is header
- 名前の通りヘッダ行の有無を指定
- Import nested directories
- フォルダを指定するとそのフォルダ内を一つのデータセットと見なしてロードします。
- フォーマットが一致しない場合警告が表示されます。またサブフォルダは処理されないため注意が必要です。
- Delimiter
- COMMA, COLON, SEMICOLON, PIPE, TABに対応
- File typeとしてはCSVの時のみ指定する形となる
- Sampling
- サンプリング方法をNone, FIrst K, Random, Stratifiedから指定。
- Stratifiedは着目するカラムを指定する必要があり、最終的にはサンプリングする形と推測。
- なお、Stratifiedには、1カラム分しか指定できないため注意が必要。
- サンプリングは、シード固定されている様子だが、どのシードに固定されているかは不明なので注意が必要。
- 補足すると、別のデータソースとして作成しても、同じものがサンプリングされる。
ファイルに応じてある程度自動でFile typeやDelimiterを選択してくれるようですが、念のため自身でチェックしましょう。
今回は自動で選択されたもので問題なさそうですので、変更せずにこのまま進めます。
以下で「Import」を押せば先に進めます。
しばらく待つと、以下のような画面に遷移します。
この画面の状態は、データソース作成が終わり、それに接続されるData typesというものが自動で作成され、そのData typesの編集画面に自動遷移した状態となっています。
右側の「ALL STEPS」にここまでのフローが表示され、「S3 Source」と「Data types」が作成されていることがわかります。
実際に左上の「Data flow」でData flowを表示する画面に戻ると、以下のようにGUIでS3とData typesが見れるようになっています。
Data typesをダブルクリックすると先ほどの編集画面に戻ることができます。
Data typesの編集
Data typesでは、各カラムのデータ型を指定することができます。右側の「2. Data types」をドロップダウンすると、以下のような画面となります。
ここで、型を設定します。データのプレビューが左側に表示されますので、参考にしながら設定するようにします。
今回は以下のように設定しました。
「Preview」を押した後に「Update」を押すことで設定が完了します。
Add transform
次にTransformを追加してみます。Data typesの「+」をクリックして、「Add transform」をクリックし、
さらに右側の「Add step」を押下することでTransformを追加できます。(アイコンのダブルクリック後に「Add step」でもOK)
Transformは以下から選択が可能です。
変換 | 説明 |
---|---|
Custom formula | ユーザがカスタム処理をSpark SQL expressionで記述可能 |
Custom transform | ユーザがカスタム処理をPysparkやPandasで記述可能 |
Balance data | データのアンバランスを解消する Random undersampling, Random oversampling, SMOTEなどの変換を実施。 |
Dimensionality Reduction | 次元圧縮をする処理。 ドキュメントには「Reduce Dimensionality (PCA)」として記載。 |
Encode categorical | カテゴリ変数を数値にエンコードする処理。 Ordinal encode, One-hot encode, Similarity encodeが使用可能。 |
Featurize data/time | 日付時刻情報を数値にエンコードする処理。 Ordinal, Cyclicが使用可能。 ドキュメントには「Featurize Datetime」として記載。 |
Featurize text | テキストを特徴量化する処理。 CountVectorizerやTfidfも使用可能。 |
Format string | 文字から文字への変換処理。 多数あるが、例としては全て大文字・小文字にする、prefix・suffixなど。 |
Group by | 集約値をwindow関数のような形で全レコードに適用する処理が可能。 ドキュメントには明確に記載されていない。 |
Handle missing | 欠損値の処理 |
Handle outliers | 外れ値の処理 |
Handle structured column | 配列やJSONなど構造化ができてないものを変換する。 配列の展開やJSONのUnnestが可能。 ドキュメントには「Unnest JSON Data」と「Explode Array」として記載。 |
Manage columns | カラムの操作。 カラムを削除する、リネームする重複を消す、結合するなど。 |
Manage rows | 行(レコード)の操作。 SortやShuffle、重複の削除が可能。 |
Manage vectors | ベクトルを作成したり、展開することが可能。 |
Parse column as type | ドキュメントには「Parse Value as Type」として記載。 |
Process numeric | 現状はScaler処理のみが実装されている。 Standard ScalerやMinmax Scalerなどが使用可能。 |
Sampling | サンプリング処理が可能 |
Search and edit | 検索して有無をデータ化したり、検索したものを置換するなど様々な処理が可能。 |
Split data | データをtrainとtestに分けるなどの分割処理が可能。 |
Time series | 時系列の様々な変換が適用可能。 ドキュメントには「Transform Time Series」として記載。 |
Validate string | Stringデータのvalidateを実施する処理。 結果はtrue, falseで格納される。 |
多数の変換があり、列方向にも行方向にも影響のある変換があるので、使用する際は意識する必要があります。
変換の詳細は、以下のドキュメントを参照ください。
今回は以下のような変換を追加しました。
- Encode categorical
- Pclass, Sex, SibSp, Parch, Embarked
- Group by
- Fare + Embarked
Encode categoricalの設定は以下です。
Group byの設定は以下です。
いずれも「Preview」後に「Apply」を実施することで追加が完了します。エラーがある場合は「Preview」時点で画面上に表示されるため、対処が必要となります。
2つの変換を追加したため、フローが更新されて以下のようになります。
Add destination
次に結果の出力について説明します。「+」をクリックして、「Add destination」をクリックします。
今回はこの中で、「Amazon S3」を選択して出力先に設定します。
設定は以下のように行います。Partitioningの設定も行えるようですが、今回は小さいデータなので実施せずにやっています。
最後に「Add destination」をクリックします。これで以下のようなフローとなりました。
Create job
一連のジョブができましたので、ここからflowを使ってジョブを作成してみます。
右上の「Create job」を押します。
ここはデフォルトのまま進めます。
インスタンスは最も小さい設定にしておきます。
作成が完了するので、Job nameのリンクをクリックします。
SageMakerのProcessing Jobとして処理されるようです。ジョブの完了を待ちます。
完了すると、出力先にcsvができていることを確認できました。
また、現在の編集中のフローの結果が欲しいだけの場合は、データのエクスポートができますので「補足4:フロー編集時のデータのエクスポート」の方法を参照ください。
補足事項
補足1:インスタンスの稼働状況
Studioの左側のアイコンの上から三番目(白抜きの丸に黒い四角のアイコン)を押すと、稼働中のインスタンス一覧が確認できますので、ここを見ながら稼働中であることを意識しておきましょう。
またStudioにログインする前の画面の、Domainユーザの詳細画面で、以下のように稼働中のものを確認することが可能です。
詳細なステータス遷移については、後者の方が確認しやすいかなと思いますので、参考にされてください。
補足2:後からノードを編集する
基本的にはフローのアイコンをダブルクリックするか、フローの右の「+」ボタンからEdit画面にアクセスする方法で編集が可能です。
一部気が付いた範囲では、データソースについては「+」クリックからの「Edit dataset」の方のみで編集が可能となっているのでご注意ください。
補足3:異なるインスタンスタイプで実行したい場合
デフォルトではml.m5.4xlarge
インスタンスが使用されますが、異なるインスタンスタイプを使用したい場合は、右上の以下部分をクリックすると、
以下のようにインスタンスを選択して変更することが可能です。試しにml.r5.4xlarge
を選んでみます。
変更を確定すると、Switching instanceのダイアログが表示されます。
完了した後は、元のml.m5.4xlarge
は立ち上がったままとなりますので、必要に応じて終了してください。
補足4:フロー編集時のデータのエクスポート
通常はデータの出力結果は、「Create job」でジョブを作成して得ることができますが、いま既に読み込み済みのデータについては即座にエクスポートすることも可能です。
今回は、Group byのアイコンをダブルクリックし、
以下の「Export data」をクリックします。
出力先のS3バケットを適切に編集して、「Export data」をクリックします。
これでcsvでエクスポートすることが可能です。
まとめ
いかがでしたでしょうか。Amazon SageMakerのData Wranglerについての使用方法について触れていきました。
機能が豊富なのでイメージが湧きづらかったのですが、今回整理したことにより解像度が上がった気がします。 注意点もいくつかありますので良く把握したうえで活用していきたいと思います。
本記事が、今後Data Wranglerを活用されようとする方の一助となれば幸いです。